/*
函数返回引用类型的探讨 马晓晨修改了样例，更加直观3-19 20：30
*/
#include <iostream>
float temp;          //定义全局变量temp
float fn1(float r);  //声明函数fn1
float &fn2(float r); //声明函数fn2
float fn1(float r)   //定义函数fn1，它以返回值的方法返回函数值
{
    temp = (float)(r * r * 3.14);
    std::cout << "fn1 actived, &temp=" << &temp << std::endl;
    return temp;
}
float &fn2(float r) //定义函数fn2，它以引用方式返回函数值
{
    temp = (float)(r * r * 3.14);
    std::cout << "fn2 actived, &temp=" << &temp << std::endl;
    return temp;
}
int main() //主函数
{
    std::cout <<"normal &temp ="<< &temp << std::endl;
    float a = fn1(10.0); //第1种情况，系统生成要返回值的副本（即临时变量）
    std::cout << "a=fn1 actived, &a=" << &a << std::endl << std::endl; 
    //float &b=fn1(10.0); //第2种情况，会出错（不同 C++系统有不同规定）
    //不能从被调函数中返回一个临时变量或局部变量的引用
    float c = fn2(10.0);  //第3种情况，系统不生成返回值的副本,可以从被调函数中返回一个全局变量的引用
    std::cout << "c=fn2 actived, &c=" << &c << std::endl << std::endl;
    float &d = fn2(10.0); //第4种情况，系统不生成返回值的副本,可以从被调函数中返回一个全局变量的引用
    std::cout << "&d=fn2 actived, &d=" << &d << std::endl;
    std::cout << a << " " << c << " " << d;
    
}
